package com.rss;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import android.content.Context;
import android.util.Log;
import com.rss.EntityDecoder;

public class RssManejador extends DefaultHandler {

	// Variables para definir al elemto. actual
	private boolean inElemento = false;
	private boolean inTitulo = false;
	private boolean inEnlace = false;
	private boolean inContenido = false;

	// Articulo y feed temporal
	private Articulo articuloActual = new Articulo();
	private Feed feedActual = new Feed();

	// Numero de articulos añadidos
	private int articulosAnadidos = 0;

	// Numero de articulos a actualizar
	private static final int LIMIT_ARTICULOS = 15;

	// Valores para el flag
	private static final int FLAG_FEED = 0;
	private static final int FLAG_ARTICULOS = 1;
	private static final int FLAG_SUGERENCIAS = 2;

	// Flag para conocer si busco articulos o nombre de un feed
	private int Flag;

	private RssDB db = null;

	public void startElement(String uri, String name, String qName,
			Attributes atts) {

		if (name.trim().equals("title"))
			inTitulo = true;
		else if (name.trim().equals("item"))
			inElemento = true;
		else if (name.trim().equals("link"))
			inEnlace = true;
		else if (name.trim().equals("description"))
			inContenido = true;
	}

	public void endElement(String uri, String name, String qName)
			throws SAXException {
		if (name.trim().equals("title"))
			inTitulo = false;
		else if (name.trim().equals("item"))
			inElemento = false;
		else if (name.trim().equals("link"))
			inEnlace = false;
		else if (name.trim().equals("description"))
			inContenido = false;

		// Check if looking for feed, and if feed is complete
		if (Flag == FLAG_FEED && feedActual.url != null
				&& feedActual.titulo != null) {

			// We know everything we need to know, so insert feed and exit

			// APERTURA
			db.open();
			db.insertarFeed(feedActual.titulo, feedActual.url);

			// CIERRE
			db.close();
			throw new SAXException();
		}

		// Check if looking for article, and if article is complete
		if (Flag == FLAG_ARTICULOS && articuloActual.url != null
				&& articuloActual.titulo != null
				&& !articuloActual.contenido.equals("")) {
			// APERTURA
			// quitando caracteres HTML antes de añadir
			articuloActual.titulo = EntityDecoder.htmlToChar(articuloActual.titulo);
			articuloActual.contenido = EntityDecoder.htmlToChar(articuloActual.contenido);
			db.open();
			db.insertarArticulo(feedActual.feedId, articuloActual.titulo,
					articuloActual.url, articuloActual.contenido);

			// CIERRRE
			db.close();
			articuloActual.titulo = new String();
			articuloActual.url = null;
			articuloActual.contenido = new String();

			// Lets check if we've hit our limit on number of articles
			articulosAnadidos++;
			if (articulosAnadidos >= LIMIT_ARTICULOS)
				throw new SAXException();
		}
		
		// SUGERENCIAS
		
		if (Flag == FLAG_SUGERENCIAS && articuloActual.url != null
				&& articuloActual.titulo != null
				&& !articuloActual.contenido.equals("")) {
			// APERTURA
			// quitando caracteres HTML antes de añadir
			articuloActual.titulo = EntityDecoder.htmlToChar(articuloActual.titulo);
			articuloActual.contenido = EntityDecoder.htmlToChar(articuloActual.contenido);
			db.open();
			db.insertarSugerencia(articuloActual.titulo,articuloActual.url, articuloActual.contenido);

			// CIERRRE
			db.close();
			articuloActual.titulo = new String();
			articuloActual.url = null;
			articuloActual.contenido = new String();

			// Lets check if we've hit our limit on number of articles
			articulosAnadidos++;
			if (articulosAnadidos >= LIMIT_ARTICULOS)
				throw new SAXException();
		}

	}

	public void characters(char ch[], int start, int length) {

		String chars = (new String(ch).substring(start, start + length));
		
		
		

		try {
			// If not in item, then title/link refers to feed
			if (!inElemento) {
				if (inTitulo)
					feedActual.titulo = chars;

			} else {
				if (inEnlace)
					articuloActual.url = new URL(chars);
				if (inTitulo)
					articuloActual.titulo += chars;
				// articuloActual.titulo += EntityDecoder.htmlToChar(chars);
				// articuloActual.titulo += chars;
				if (inContenido)
					articuloActual.contenido += chars;
				// articuloActual.contenido += EntityDecoder.htmlToChar(chars);
			}
		} catch (MalformedURLException e) {
			Log.e("RSSREADER Manejador characters", e.toString());
		}

	}

	public void crearFeed(Context ctx, URL url) {
		try {

			Flag = FLAG_FEED;
			db = new RssDB(ctx);
			feedActual.url = url;

			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser sp = spf.newSAXParser();
			XMLReader xr = sp.getXMLReader();
			xr.setContentHandler(this);

			xr.parse(new InputSource(url.openStream()));

		} catch (IOException e) {
			Log.e("crearFeed 1", e.toString());
		} catch (SAXException e) {
			Log.e("crearFeed 2", e.toString());
		} catch (ParserConfigurationException e) {
			Log.e("crearFeed 3", e.toString());
		}
	}

	public void actualizarArticulos(Context ctx, Feed feed) {
		try {
			Flag = FLAG_ARTICULOS;
			db = new RssDB(ctx);
			feedActual = feed;
			// TODO : esto es una locura!
			Log.e("test2", feedActual.url.toString());

			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser sp = spf.newSAXParser();
			XMLReader xr = sp.getXMLReader();
			xr.setContentHandler(this);

			xr.parse(new InputSource(feedActual.url.openStream()));
		} catch (IOException e) {
			Log.e("RSSREADER manejador actualizarArticulos 1", e.toString());
		} catch (SAXException e) {
			Log.e("RSSREADER manejador actualizarArticulos 2", e.toString());
		} catch (ParserConfigurationException e) {
			Log.e("RSSREADER manejador actualizarArticulos 3", e.toString());
		}
	}
	
	public void crearSugerencia(Context ctx, URL url) {
		try {
			Flag = FLAG_SUGERENCIAS;
			db = new RssDB(ctx);
			
			// TODO : esto es una locura!
			Log.e("test2", url.toString());

			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser sp = spf.newSAXParser();
			XMLReader xr = sp.getXMLReader();
			xr.setContentHandler(this);

			xr.parse(new InputSource(url.openStream()));
		} catch (IOException e) {
			Log.e("RSSREADER manejador crearSugerencia 1", e.toString());
		} catch (SAXException e) {
			Log.e("RSSREADER manejador crearSugerencia 2", e.toString());
		} catch (ParserConfigurationException e) {
			Log.e("RSSREADER manejador crearSugerencia 3", e.toString());
		}
	}

}
